perm filename INTFA2.PAL[AL,HE] blob
sn#367352 filedate 1978-07-12 generic text, type C, neo UTF8
COMMENT ā VALID 00008 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 .TITLE INTFAC
C00004 00003 DAC TEST SECTION
C00006 00004 ADC TEST SECTION
C00009 00005 CONT. OF ADC ROUTINE
C00010 00006 SUBRS AND CLOCK INTERRUPT ROUTINE
C00013 00007 SECTION TO READ FORCE WRIST AND RETURN INFORMATION TO PDP10
C00016 00008 LOCAL STORAGE
C00018 ENDMK
Cā;
.TITLE INTFAC
;replaced all rug references with ddt
.INSRT ALHEAD.PAL[AL,HE]
ISREF== 0 ;IS A REFERENCE READING FOR THE FORCE BALANCE
ISBFC== 1 ;TO READ FORCE SENSOR ON BLUE ARM
.=1000
.INSRT IO.PAL[AL,HE]
;YELLOW INTERFACE DEFINITIONS
DRATRP ==530 ;DR11 A VECTOR
DRBTRP ==534 ;DR11 B VECTOR
DR11S =167770 ;DR11 STATUS WORD
DR11O =167772 ;DR11 OUTPUT REGISTER
DR11I =167774 ;DR11 INPUT REGISTER
PANICB =200
ENABLE =400 ;INTERFACE ENABLE
;BLUE INTERFACE DEFINITIONS
DACCSR =174000 ;DAC STATUS AND CONTROL WORD ADDRESS
ADCSR =174004 ;ADC CONTROL AND STATUS WORD ADDRESS
ADCHAN =174005 ;ADC CHANNEL ADDRESS
ADCVAL =174006 ;ADC VALUE ADDRESS
;COMMUNICATIONS LINK TO PDP10
MASTER==10567
MASLOC=110220 ;was 100000
FDATA=110222 ;was 100002
; program initialization
.EVEN
STARTI: RESET
MOV #1000,SP ;initialize stack
CLR PS ;initialize processor status
CLR CLKCNT ;clear clock registers- trap restart
CLR CLKSET
CLR CLKS
LDFPS #0
MOV #9,R0 ;SET TTY OUTPUT FORMAT
MOV #2,R1
JSR PC,FORMAT
MOV #CLKSER,CLKTRP ;SET CLOCK INTERRUPT ROUTINE
MOV #340,CLKTRP+2
;ASK IF DAC OR ADC CHECK
MOV #COM1,SG ;ASK IF ADC OR DAC
JSR PC,GETNUM
TST R0
BNE ISADC
;DAC TEST SECTION
DACSEC: CLR DR11S ;SET DR11 DAC MODE
MOV #COM2,SG ;GET DAC CHANNEL
JSR PC,GETNUM
MOVB BRK(R0),R1 ;GET BRAKE MASK BIT
BIS #ENABLE,R1 ;ADD ON INTERFACE ENABLE BIT
MOV R1,BRKMSK
MOVB DNE(R0),R1 ;GET DONE BIT MASK
SWAB R1
MOV R1,DNEMSK
ASH #13.,R0
MOV R0,R3
MOV #COM3,SG ;CHECK IF POSITION OR TORQUE MODE
JSR PC,GETNUM
TST R0
BEQ ISCUR ;BRANCH IF CURRENT MODE
MOV #1,STPDNE ;ASSUME DONE MASK TO BE CHECKED
MOV #COM11,SG ;ASK IF DONE BIT TO BE CHECKED
JSR PC,GETNUM
TST R0
BNE WILCHK ;SKIP IF DONE BIT TEST REQUESTED
BR .+6
ISCUR: BIS #10000,R3 ;SET CURRENT MODE BIT
CLR STPDNE ;DON'T EVER STOP ON DONE CONDITION
WILCHK: MOV R3,DACCHN ;SAVE DAC CHANNEL
MOV #COM4,SG ;GET DC DAC VALUE
JSR PC,GETNUM
MOV R0,DACDC
MOV #COM5,SG
JSR PC,GETNUM ;GET DAC RAMP VALUE
MOV R0,DACCHG
CLR COUNT
CLR DR11S ;RESET DR11
CLR PDAC ;START AT BOTTOM OF RAMP
CLR PTIME ;INDICATE FIRST PASS THROUGH
MOV #10.,CLKSET ;SET CLOCK TO INTERRUPT EVERY 100USEC
MOV #111,CLKS
CLKWT: TST DNEMSK ;CHECK IF DONE BIT ON
BNE .+6
JMP DDT ;EXIT IF ALL DONE
TSTB KBIS ;ELSE CHECK IF SOMEONE HIT THE TTY
BEQ CLKWT ;LOOP TILL SOMETHING HAPPENS
CLR CLKS ;STOP THE DAC ROUTINE
JMP DDT
;ADC TEST SECTION
ISADC:
.IFZ ISBFC
MOV #2,DR11S ;SET DR11 ADC MODE
.ENDC
MOV #COM6,SG ;ASK IF TYPE OUT REQUESTED
JSR PC,GETNUM
MOV R0,TYPADC
MOV #COM7,SG ;SINGLE CHANNEL OR INDEX?
JSR PC,GETNUM
BIC #177776,R0
MOV R0,INDX
; *K BEQ SNGCHN
CLR ODDEVN
; *K BR ADCSTR
SNGCHN: MOV #COM8,SG ;GET STARTING CHANNEL
JSR PC,GETNUM
BIC #177740,R0
mov r0,FIRSTC ;SAVE FIRST CHANNEEL TO READ
MOV R0,ADCCHN ;SAVE START CHANNEL
MOV #TOPCLR,SG
JSR PC,TYPSTR
;ADC LOOP
ADCSTR:
.IFZ ISBFC
MOV #2,DR11S ;REQUEST ADC CONVERSION
ADCLP: MOV ADCCHN,DR11O ;REQUEST ADC CONVERSION
MOV #100.,R1 ;WAIT LOOP COUNT
WAITLP: BIT #200,DR11S
BNE ADCDNE ;BRANCH IF DONE
.IFF
ADCLP: MOVB ADCCHN,ADCHAN ;REQUEST ADC CONVERSION FROM BLUE INTERFACE
MOV #100.,R1 ;WAIT LOOP COUNT
WAITLP: TSTB ADCSR ;CONVERSION DONE?
BMI ADCDNE
.ENDC
DEC R1
BGE WAITLP ;REPEAT IF STILL MORE TIME LEFT
MOV #COM9,SG
JSR PC,TYPSTR
JMP DDT
.IFZ ISBFC
ADCDNE: MOV DR11I,R0 ;GET ADC READING
.IFF
ADCDNE: MOV ADCVAL,R0 ;GET ADC RADING FORM BLUE INTERFACE
.ENDC
TST TYPADC ;CHECK IF TYPE OUT REQUIRED
BEQ GETNXT ;SKIP IF NO
MOV #IOBUF,SG
ADD #2048.,R0
JSR PC,CVO ;CONVERT TO ASCII *K
MOVB #40,(SG)+
MOVB #40,(SG)+
MOVB #40,(SG)+
MOVB #40,(SG)+
CLRB (SG)
MOV #IOBUF,SG ;TYPE OUT READING
JSR PC,TYPSTR
JSR PC,CRLF
;CONT. OF ADC ROUTINE
GETNXT: TST INDX ;CHECK IF INDEXING OR SINGLE CHANNEL
BEQ TSTDNE
COM ODDEVN ;CHECK IF DISPLAY IN RIGHT OR LEFT PART OF SCREEN
BEQ ADDIDX ;SKIP IF MOVING TO LEFT
MOV #RIGHT,SG
JSR PC,TYPSTR
ADDIDX: ADD INDX,ADCCHN ;POINT TO NEXT CHANNEL
CMP MAXCHN,ADCCHN ;CHECK IF WRAP AROUND TIME
BGE TSTDNE ;SKIP IF STILL OK
mov FIRSTC,ADCCHN ;ELSE START WITH CHANNEL FIRSTC AGAIN
CLR ODDEVN
TST TYPADC ;CHECK IF TYPE OUT REQUIRED
BEQ TSTDNE
MOV #TOP,SG
JSR PC,TYPSTR
TSTDNE: TSTB KBIS ;CHECK IF VT05 HIT
BEQ ADCLP
JMP DDT
;SUBRS AND CLOCK INTERRUPT ROUTINE
GETNUM: JSR PC,TYPSTR
MOV #IOBUF,SG
JSR PC,INSTR
MOV #IOBUF,SG
JSR PC,INTSCN
RTS PC
CLKSER: MOV DACDC,R0 ;GET DAC OUTPUT VALUE
ADD PDAC,R0
MOV R0,R1
BGE .+4 ;CHECK IF IN RANGE
NEG R1
CMP #4000,R1
BGE VALOK ;BRANCH IF OK
MOV DACDC,R0 ;ELSE START OVER AT DC VALUE
MOV DACCHG,PDAC
NEG PDAC
;
; MOV #1,DR11S ;USE THIS TO SYNC ON WHEN TESTING
; MOV BRKMSK,DR11O
;
VALOK: BIC #170000,R0
BIS DACCHN,R0 ;ADD DAC CHANNEL
CLR DR11S
MOV R0,DR11O
ADD DACCHG,PDAC
TST PTIME ;CHECK IF NOT FIRST PASS THROUGH
BNE CHKDNE ;BRANCH IF NOT PASS ONE
MOV #1,DR11S ;ELSE SET BRAKE MODE
MOV BRKMSK,DR11O ;TURN OFF BRAKE AND ENABLE INTERFACE
MOV #1,PTIME ;INDICATE END OF FIRST PASS
RTI
CHKDNE: MOV #3,DR11S ;GET ARM STATUS BITS
MOV DR11I,R0
BIT #PANICB,R0 ;CHECK IF PANIC BUTTON HIT
BEQ STPIT ;STOP SERVICING IF BUTTON HIT
TST STPDNE ;CHECK IF IN RANGE CHECKING TO BE DONE
BNE .+4
RTI ;RETURN IF NOT CHECKING REQUIRED
BIT DNEMSK,R0 ;CHECK IF IN RANGE
BNE INRNGE
CLR COUNT ;CLEAR IN RANGE COUNT
RTI ;EXIT IF STILL NOT DONE
INRNGE: INC COUNT ;INCREMENT NUMBER OF SEQUENCE TIMES
CMP #3,COUNT ;CHECK IF AT LEAST 3 TIMES
BLE .+4
RTI
STPIT: CLR CLKS ;ELSE STOP THE CLOCK
CLR DNEMSK
MOV #1,DR11S ;SET THE BRAKES
CLR DR11O
RTI
;SECTION TO READ FORCE WRIST AND RETURN INFORMATION TO PDP10
FORCE:
F: MOV #MASTER,MASLOC ;INDICATE READY TO READ FORCE WRIST
;WAIT LOOP LOOKING AT COMMAND BLOCK FROM PDP10
WTLP: TST KBIS ;CHECK IF ANYONE HIT VT05 KEYBOARD
BEQ CHKMST
CLRB KBIR
JMP DDT ;EXIT TO DDT
CHKMST: CMP #MASTER,MASLOC ;CHECK IF NO ONE ALTERED THE M.NUMBER YET
BEQ WTLP
MOV #FDATA,R1
MOV #10.,R2 ;READ 10 SETS OF DATA
SETLP: MOV #9.,R3 ;EIGHT STRAIN GAGES IN ALL+REF CHAN
.IFZ ISBFC
CLR R4 ;START WITH CHANNEL 0
REDLP: MOV #2,DR11S ;REQUEST ADC CONVERSION
MOV R4,DR11O
MOV #100.,R0 ;WAIT LOOP COUNT
WLP: BIT #200,DR11S
BNE CNVDNE ;BRANCH IF DONE
.IFF
MOV #30,R4 ;FIRST STRAIN GAGE CHANNEL
REDLP: MOVB R4,ADCHAN ;START CONVERTING STRAIN GAGE READING
MOV #100.,R0 ;WAIT LOOP COUNT
WLP: TSTB ADCSR ;WAIT TILL CONVERSION COMPLETED
BMI CNVDNE
.ENDC
DEC R0
BGE WLP ;REPEAT IF STILL MORE TIME LEFT
MOV #COM9,SG
JSR PC,TYPSTR
JMP DDT
.IFZ ISBFC
CNVDNE: MOV DR11I,R0 ;GET ADC READING
.IFF
CNVDNE: MOV ADCVAL,R0 ;GET READING FROM BLUE INTERFACE
.ENDC
; ADD #2048.,R0
MOV R0,(R1)+ ;SAVE READING
INC R4 ;POINT TO NEXT CHANNEL
SOB R3,REDLP ;REPEAT UNTIL DONE
.IFZ ISREF
CLR -2(R1) ;NO REFERENCE READING
.ENDC
MOV #15.,-(SP) ;SLEEP FOR 15 MSEC
JSR PC,SLEEP
TST (SP)+
SOB R2,SETLP
BR F ;REPEAT
SLEEP: MOV #1000.,R5 ;1 MSEC DELAY LOOP
2$: SOB R5,2$
DEC 2(SP)
BPL SLEEP ;CONTINUE IF MORE TIME LEFT
RTS PC
;LOCAL STORAGE
ODDEVN: 0
DACCHN: 0
DACDC: 0
DACCHG: 0
PDAC: 0
TYPADC: 0
ADCCHN: 0
INDX: 0
MAXCHN: .WORD 37
BRK: .BYTE 1,2,4,10,20,40,100,0
DNE: .BYTE 1,2,4,10,20,40,100,0
BRKMSK: 0
DNEMSK: 0
STPDNE: 0
COUNT: 0
PTIME: 0
FIRSTC: 0
;OUTPUT STRINGS
COM1: .ASCIZ /DAC OR ADC(0:1) = /
COM2: .ASCIZ /DAC NUMBER (0:7) = /
COM3: .ASCIZ /CURRENT OR POSITION MODE (0:1) = /
COM11: .ASCIZ /CHECK DONE BIT (0=NO,1=YES) = /
COM4: .ASCIZ /DAC DC VALUE (-2048 : 2047) = /
COM5: .ASCIZ /DAC CHANGE EVERY 100 USEC = /
COM6: .ASCIZ /TYPE ADC READINGS (0:1)? = /
COM7: .ASCIZ /SINGLE CHANNEL OR INDEX (0:1) = /
COM8: .ASCIZ /FIRST ADC CHANNEL (DECIMAL) = /
COM9: .ASCIZ /**ERROR** NO ADC DONE SIGNALED
/
TOP: .BYTE 35,10,10,10,0
TOPCLR: .BYTE 35,35,37,37,37,10,10,10,0
RIGHT: .BYTE 32,10,10,10,30,30,30,30,30,30,30
.BYTE 30,30,30,30,0
IOBUF: .BLKW 100.
PBUF: .BLKW 300.
.END STARTI